const express = require("express");
const bcrypt=require('bcryptjs')
const router=express.Router()
// 导入数据库 模块
const db=require('../db/index');
// 导入生成token的包
const jwt=require('jsonwebtoken')
// 导入全局配置文件
const config=require('../config')
// 这是中间件包
const expressJoi = require('@escook/express-joi')
const {reg_login_schema }=require('../schema/user')   //导入规则值

// 注册
router.post('/reguser',expressJoi(reg_login_schema),(req,res)=>{
    // 客户端传递过来的数据用req.body获取
    const userInfo=req.body
    console.log(userInfo);
    if(!userInfo.username || !userInfo.password){
        return res.send({status:1,message:'用户名或密码不正确'})
    }

    const sqlSelect='select * from  user where username=?'
   db.query(sqlSelect,userInfo.username,(err,results)=>{
            console.log(err);
            console.log(results);
            // 执行sql语句失败
            if(err){
                return res.send({status:401,message:err.message})
            }
            // 判断用户名是否存在
            if(results.length>0){
                return res.send({status:401,message:'用户名已存在'})
            }

            //  调用bcrypt.hashSync()对密码进行加密
            userInfo.password=bcrypt.hashSync(userInfo.password,10)
            console.log(userInfo);

        // 插入
        const sqlInsert='insert into user  set ?'
        db.query(sqlInsert,userInfo,(err,results)=>{
            if(err)return res.send({Status:401,message:err.message})
            if(results.affectedRows !==1)return res.send({status:401,message:'注册失败，请稍后'})
                res.send({status:200,message:'注册成功'})
        })
   })
    
    // res.send('reguser ok')
})


// 登录
router.post('/login',expressJoi(reg_login_schema),(req,res)=>{
    userInfo=req.body
    console.log(userInfo);
    
    sqlshow='select * from user where username=?'
    db.query(sqlshow,userInfo.username,(err,results)=>{
        if(err) return res.send({status:401,message:err.message})
        // 判断是否有这个用户
        if(results.length !==1) return res.send({status:401,message:'登录失败'})

        // 判断密码是否正确 验证比对,返回布尔值表示验证结果 true表示一致，false表示不一致 
        // 第一个参数是用户输入密码 第二个是数据库密码
        const  isOk = bcrypt.compareSync(userInfo.password, results[0].password) 
        if(!isOk) return res.send({status:401,message:'登录失败，账号或者密码错误...'}) 
       
        // 登录成功返回生成token 这里是把密码和头像变成空的好不然容易被黑客破解
        const user= {...results[0],password:'',user_pic:''} 
        // console.log(user);
        // 对用户信息进行加密，生成token字符串
        const token='Bearer ' +jwt.sign(user,config.jwtKey,{expiresIn:config.Timedate})
        // console.log(token);
        // 调用res.send()将token响应给客户端
        res.send({status:200,message:'登录成功...',token:token})
    })
})



module.exports=router
// module.exports={router}